package fr.u.psud.polytech.controller;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import fr.u.psud.polytech.database.Action;
import fr.u.psud.polytech.database.Entrepot;
import fr.u.psud.polytech.database.HibernateUtil;
import fr.u.psud.polytech.database.User;

public class UserManager {
	public void addUser(String nom, String prenom, String poste, String login, String password,Entrepot ent) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// début de la transaction
			trns = session.beginTransaction();
			// création de l'Produit

			User u = new User ();
			u.setNom(nom);
			u.setPrenom(prenom);
			u.setPoste(poste);
			u.setLogin(login);
			u.setPassword(password);
			u.setEntrepot(ent);
			session.save(u);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (Exception e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
	}

	public User getUser(Integer id) {
		User u= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			trns = session.beginTransaction();
			u = (User) session.get(User.class, id);
			session.getTransaction().commit();
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return u;
	}

	public User getUser(String login) {
		User u= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			trns = session.beginTransaction();
			Query query = session.createQuery("from User where login='"+login+"'");
			List<User> userList= query.list();
			if(!userList.isEmpty()){
				u= userList.get(0);
			}
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}
		return u;
	}

	public List<User> getUsers(){
		List<User> userList= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query query = session.createQuery("from User");

			userList = (List<User>) query.list();
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return userList;
	}


	public List<User> getUsers(int pageNumber, int pageSize){
		List<User> userList= null;

		Transaction trns = null;
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query query = session.createQuery("from User");
			query = query.setFirstResult(pageSize * (pageNumber - 1));
			query.setMaxResults(pageSize);
			userList= query.list();
			session.getTransaction().commit()	;
		} catch (RuntimeException ex) {
			if (trns != null) {
				trns.rollback();
			}
			ex.printStackTrace();
		} finally {
			session.flush();
			session.close();
		}

		return userList;
	}


	public void deleteUser(Integer id) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// création de l'Produit
			User u = getUser(id);
			// début de la transaction
			trns = session.beginTransaction();

			session.delete(u);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();   
		} finally {
			session.flush();
			session.close();
		}
	}

	public void addAction(User u,Action a ) {
	}

	public void updateUser(int user_id, int ent_id,int [] act_id) {
		Transaction trns = null;
		// ouverture de la session
		Session session = HibernateUtil.getSessionFactory().openSession();
		try {
			// dÃ©but de la transaction
			trns = session.beginTransaction();
			User user = (User) session.get(User.class, user_id);
						
			Entrepot entp = new EntrepotManager().getEntrepot(ent_id);

			
			//Creation de la nouvelle liste d'action associée a l'utilsateur
			Set<Action> userAction = new HashSet<Action>();
			
			
			if(act_id !=null){
				for(int i=0; i<act_id.length;i++)
				{
					userAction.add(new ActionManager().getAction(act_id[i]));
				}
			}
			//Ajout de l'entrepot et de la liste des actions a l'utilisateur
			user.setEntrepot(entp);
			user.setListAction(userAction);
			
			//Mise a jour des données
			session.update(user);
			session.getTransaction().commit();
		}
		// gestion des exceptions s'il y'en a
		catch (RuntimeException e) {
			if (trns != null) {
				trns.rollback();
			}
			e.printStackTrace();   
		} 
	}
}
